from PySide2.QtWidgets import QMessageBox, QApplication
from PySide2.QtUiTools import QUiLoader
from urllib.parse import parse_qs
import requests
import json


class ApiSoft:

    def __init__(self):
        # 直接读取ui文件来生成页面
        self.ui = QUiLoader().load('try_qt.ui')
        # 解决session问题
        self.resession = requests.Session()
        # 信息流向槽
        self.ui.plusButton.clicked.connect(self.plusTableButton)
        self.ui.subButton.clicked.connect(self.subTableButton)
        self.ui.SendButton.clicked.connect(self.kernelApiSend)
        self.ui.pushButton_4.clicked.connect(self.clearAllData)

    # 点击清除按钮，会清空所有数据
    def clearAllData(self):
        # self.ui.lineEdit.clear()
        # self.ui.plainTextEdit.clear()
        # self.ui.tableWidget.clearContents()
        # self.ui.tableWidget.setRowCount(0)
        self.ui.plainTextEdit_2.clear()

    # 用来自减的方法
    def decrement(self, num):
        num -= 1
        return num

    # 增加消息头中的行数
    def plusTableButton(self):
        # 获取当前的行数
        rowcount = self.ui.tableWidget.rowCount()
        # 插入行（根据实际行数来判断，始终多一，这样就能保证每次增加一行）
        self.ui.tableWidget.insertRow(rowcount)

    # 减少消息头中的行数
    def subTableButton(self):
        # 获取当前行数
        rownum = self.ui.tableWidget.rowCount()
        # 删除行，根据现在有多少行来删除最后一行
        self.ui.tableWidget.removeRow(self.decrement(rownum))

    # 获取消息头有几行几列
    def getTablerowcol(self):
        # 拿到有多少行多少列
        rowcount = self.ui.tableWidget.rowCount()
        colcount = self.ui.tableWidget.columnCount()
        return rowcount, colcount

    # 获取消息体中的urlencoded格式文本，并进行修改，改为字典（JSON）格式
    def messageinfo(self):
        # 获取消息体中的内容
        messagebody = self.ui.plainTextEdit.toPlainText()
        parsed_parse = parse_qs(messagebody)
        return parsed_parse

    # 独立出来的一个获取消息体文本的函数，避免与登录冲突
    def messageputinfo(self):
        messagebody = self.ui.plainTextEdit.toPlainText()
        return messagebody

    # 查询用的函数，用于将消息头的文本提取出来，再变成字典格式传输
    def getReqinfo(self):
        parse = {}
        if self.getTablerowcol() is not None:
            for rowtext in range(self.getTablerowcol()[0]):
                name_item = self.ui.tableWidget.item(rowtext, 0)
                value_item = self.ui.tableWidget.item(rowtext, 1)
                if name_item and value_item:
                    # 写成一个字典
                    parse[name_item.text()] = value_item.text()
        return parse

    def kernelApiSend(self):   # http://127.0.0.1
        # 获取下拉框用户选择的请求格式,根据请求协议发起正确的请求
        method = self.ui.comboBox.currentIndex()
        # 获取地址信息
        lineedit = self.ui.lineEdit.text()
        # 懂的都懂，不解释
        if method == 0:
            response = self.resession.get(f'{lineedit}', params=self.getReqinfo())
        elif method == 1:
            try:
                # 拿到JSON数据，并且将JSON中的换行之类的符号转译
                reque_info = self.messageputinfo()
                put_jsondata = json.dumps(json.loads(reque_info))
                response = self.resession.put(f"{lineedit}", data=put_jsondata, headers={'Content-Type': 'application/json'})
            except json.JSONDecodeError:
                response = self.resession.post(f"{lineedit}", data=self.messageinfo())
        elif method == 2:
            # 拿到JSON数据，并且将JSON中的换行之类的符号转译
            reque_info = self.messageputinfo()
            put_jsondata = json.dumps(json.loads(reque_info))
            # 执行，并且将消息体说明为JSON
            response = self.resession.put(f"{lineedit}", data=put_jsondata, headers={'Content-Type': 'application/json'})
        elif method == 3:
            # 拿到JSON数据，并且将JSON中的换行之类的符号转译
            reque_info = self.messageputinfo()
            put_jsondata = json.dumps(json.loads(reque_info))
            response = self.resession.delete(f"{lineedit}", data=put_jsondata, headers={'Content-Type': 'application/json'})
        self.ui.plainTextEdit_2.setPlainText(f'''{response.json()}''')


app = QApplication([])
Api_soft = ApiSoft()
Api_soft.ui.show()
app.exec_()
